Use case: Start a write/read in DMA mode ¶
Sequence diagram ¶
Code snippet ¶
|
HAL1 |
HAL2 |
|---|---|
QSPI_HandleTypeDef QSPIHandle;
QSPI_RegularCmdTypeDef scommand = {0};
sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
sCommand.AddressSize = QSPI_ADDRESS_24_BITS;
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
sCommand.Instruction = SECTOR_ERASE_CMD;
sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
sCommand.Address = address;
sCommand.DataMode = QSPI_DATA_NONE;
sCommand.DummyCycles = 0;
HAL_QSPI_Command(&QSPIHandle, &scommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
HAL_QSPI_Transmit_DMA(&QSPIHandle, aTxBuffer);
HAL_DMA_IRQHandler(&QSPIHandle);
HAL_QSPI_TxCpltCallback(&QSPIHandle);
HAL_QSPI_Command(&QSPIHandle, &command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
sConfig.Match = 0x00;
sConfig.Mask = 0x01;
sConfig.MatchMode = QSPI_MATCH_MODE_AND;
sConfig.StatusBytesSize = 1;
sConfig.Interval = 0x10;
sConfig.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE;
HAL_QSPI_AutoPolling_IT(&QSPIHandle, &sConfig);
QSPI_IRQHandler(&QSPIHandle);
HAL_QSPI_StatusMatchCallback(&QSPIHandle);
HAL_QSPI_Command(&QSPIHandle, &command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
HAL_QSPI_Receive_DMA(&QSPIHandle, aRxBuffer);
HAL_DMA_IRQHandler(&QSPIHandle);
HAL_QSPI_RxCpltCallback(&QSPIHandle);
void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *hqspi)
{
// USER CODE
}
void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *hqspi)
{
// USER CODE
}
void HAL_QSPI_StatusMatchCallback(QSPI_HandleTypeDef *hqspi)
{
// USER CODE
}
|
hal_xspi_handle_t xspi;
command.operation_type = HAL_XSPI_OPERATION_COMMON_CFG;
command.io_select = HAL_XSPI_IO_7_0;
command.alternate_bytes = 0U;
command.alternate_bytes_width = HAL_XSPI_ALTERNATE_BYTES_8BIT;
command.alternate_bytes_mode = HAL_XSPI_ALTERNATE_BYTES_NONE;
command.alternate_bytes_dtr_mode_status = HAL_XSPI_ALTERNATE_BYTES_DTR_DISABLED;
/* Specific parameters for the Sector Erase command */
command.instruction = WRITE_REG_CMD;
command.instruction_mode = HAL_XSPI_INSTRUCTION_8LINES;
command.instruction_width = HAL_XSPI_INSTRUCTION_32BIT;
command.instruction_dtr_mode_status = HAL_XSPI_INSTRUCTION_DTR_DISABLED;
command.addr = MX25_FIRST_BLOCK_ADDR;
command.addr_mode = HAL_XSPI_ADDR_8LINES;
command.addr_width = HAL_XSPI_ADDR_8BIT;
command.addr_dtr_mode_status = HAL_XSPI_ADDR_DTR_ENABLED;
command.data_mode = HAL_XSPI_REGULAR_DATA_NONE;
command.data_dtr_mode_status = HAL_XSPI_DATA_DTR_ENABLED;
command.dummy_cycle = 0;
command.dqs_mode_status = HAL_XSPI_DQS_DISABLED;
command.size_byte = 2;
HAL_XSPI_SendRegularCmd(xspi, &command, XSPI_TIMEOUT);
HAL_XSPI_Transmit_DMA(xspi, data);
HAL_DMA_IRQHandler(xspi);
HAL_XSPI_TxCpltCallback(xspi);
HAL_XSPI_SendRegularCmd(xspi, &command, XSPI_TIMEOUT);
sConfig.MatchMode = HAL_XSPI_MATCH_MODE_AND;
sConfig.AutomaticStop = HAL_XSPI_AUTOMATIC_STOP_ENABLE;
sConfig.IntervalTime = 0x10;
sConfig.MatchMask = WRITE_ENABLE_MASK_VALUE;
sConfig.MatchValue = WRITE_ENABLE_MATCH_VALUE;
HAL_XSPI_ExecRegularAutoPoll_IT(xspi, &sConfig);
xspi_IRQHandler(&xspi);
HAL_XSPI_StatusMatchCallback(&xspi);
HAL_XSPI_SendRegularCmd(xspi, &command, XSPI_TIMEOUT);
HAL_XSPI_Receive_DMA(&xspi, (uint8_t *)aRxBuffer);
HAL_DMA_IRQHandler(&xspi);
HAL_XSPI_RxCpltCallback(&xspi);
void HAL_XSPI_TxCpltCallback(XSPI_HandleTypeDef *hxspi)
{
// USER CODE
}
void HAL_XSPI_RxCpltCallback(XSPI_HandleTypeDef *hxspi)
{
// USER CODE
}
|

